#include <fcntl.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/tcp.h>

#include "net/socket.h"
namespace net_tools::net{

Socket::Socket()
  :socketfd(socket(PF_INET,SOCK_STREAM|SOCK_CLOEXEC,0))
{
};
Socket::~Socket(){
  close(socketfd);
};
void Socket::Set_reused(int fd){
  int opt = 1;
  setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
};
void Socket::Set_noblocked(int fd){
  int flags;
  flags = fcntl(fd,F_GETFL,0);
  flags |= O_NONBLOCK;
  fcntl(fd,F_SETFL,flags);
};

void* Socket::Stringtonet(const char* ipaddr,void* ret){
  inet_pton(AF_INET,ipaddr,ret);
  return ret;
};
char* Socket::Nettostring(sockaddr_in addr,char* ret){
  inet_ntop(AF_INET,&addr.sin_addr.s_addr,ret,INET_ADDRSTRLEN);
  return ret;
};
void Socket::Set_nodelay(int fd){
  int opt = 1;
  setsockopt(fd,SOL_TCP,TCP_NODELAY,&opt,sizeof(opt));
};

} // namespace net_tools::net